package com.qfedu.edu.orderservice.slot.impl;

import com.qfedu.edu.constance.RedisConstance;
import com.qfedu.edu.exception.BusinessException;
import com.qfedu.edu.manager.RedisManager;
import com.qfedu.edu.orderservice.slot.generic.GenericSlot;
import com.qfedu.edu.result.ResponseCode;
import lombok.extern.slf4j.Slf4j;
import org.qfedu.edu.service.IJwtService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author xiaobobo
 * @title: CheckSaleStatusSlot
 * @projectName seckill-fy-2401-parent
 * @description: 这个是最先执行的
 * @date 2024/11/11  16:35
 */
@Component
@Slf4j
public class CheckSaleStatusSlot extends GenericSlot {

    @Autowired
    private IJwtService jwtService;

    @Autowired
    private RedisManager redisManager;

    @Override
    public int getOrder() {
        return Integer.MIN_VALUE;
    }

    @Override
    public void dealRequest(HttpServletRequest req, HttpServletResponse resp) {
        /**
         * 如果是在 最后一个slot执行了都没有问题的话那么这个人是可以秒杀这个商品的
         * 那么就要向Redis中记录这个人的购买状态
         * buy:status:用户id:课程id  0      0:正在购买   1：购买成功    2：购买失败
         */
        //执行到这里 说明用户可以购买这个商品
        //获取商品id
        String classId = req.getParameter("classId");
        //获取用户id
        String token = req.getHeader("token");
        String userId = jwtService.getUserId(token);
        //记录用户购买的状态
        String key= RedisConstance.getBuyStatusPrefix()+userId+":"+classId;
        //接下来读取这个数据
        Integer status = (Integer) redisManager.getObject(key);
        //判断是否满足条件
        if(null==status){
            //说明这个人是第一次秒杀
            log.info("用户第一次秒杀执行放行....");
            return;
        }
        //执行到这里 说明有值
        if(status==0){
            // 0:正在秒杀
            throw new BusinessException(ResponseCode.CLICK_REPEAT_EXCEPTION);
        }
        if(status==2){
            //2：秒杀失败...
            log.info("用户秒杀过但是失败了...可以从新秒杀...");
            return;
        }
        if(status==1){
            //1：代表用户已经秒杀过该产品了不能重复秒杀
            log.info("用户秒杀过该产品了 不能重复秒杀");
            throw new BusinessException(ResponseCode.BUY_REPEAT_EXCEPTION);
        }
    }
}
